test

10.3 Memleak简介

JRockit Mission Control Memory Leak Detector, 简称为 Memleak,可以动态的附加到运行中的JRockit实例,追踪Java运行时的内存变化。找出某种类型的所有实例,以及各个对象的引用关系。此外,它还可以追踪某种类型的对象分配操作。这些功能听起来都挺复杂的,实际上都简明易用。在介绍如何使用Memleak解决内存泄漏问题之前,还需要对Memleak的特性做简单介绍。

  • 趋势分析的执行开销非常小:在垃圾回收的标记过程中,会收集对象之间的引用信息。正如之前提到的,这个操作的执行时间会非常短。在运行Memleak的过程中,每次执行垃圾回收时,都会收集必要的数据。为了保证数据的及时性,默认情况下,若应用程序没有触发正常的垃圾回收,则Memleak会每10秒钟触发一次垃圾回收操作。在Memleak的配置选项中可以对此时间间隔进行配置,这大大降低了工具对应用程序的侵入性。
  • 执行内存分析时,可以无视客户端硬件:通过一台手提电脑就可以连接到拥有数GB堆内存的服务器进行分析。
  • 可以实时观测到事件和堆的变化:这是把双刃剑。它可以与应用程序进行交互,例如观察应用程序的哪些操作会导致哪些内存变化,在操作某个对象的同时观察对象数据的变化。不过,正因如此,本已被应用程序废弃的数据对象,却无法被垃圾回收器回收掉。
  • 无法进行离线分析:如果没有权限对正在运行的应用程序进行在线分析的话,就痛苦了。不过幸运的是,JRockit R28可以生成标砖的HPROF格式的堆转储,这样就能通过其他分析工具(例如Eclipse MAT)进行离线分析了。

注意,HPROF格式的堆转储文件中包含了堆的全部内容,如果堆中包含有敏感数据,则一定要小心处理堆转储文件,防止机密信息外泄。